package com.test45_JUC;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * ConcurrentHashMap
 */
public class Demo18_ConcurrentHashMap {

    public static void main(String[] args) {
        // test1();
        test2();
    }

    /**
     * 整个的集合实际上都存在有一个核心问题：输出时无法修改数据
     */
    public static void test1() {
        Map<String, String> map = new HashMap<>();
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                for (int y = 0; y < 10; y++) {
                    map.put("【" + Thread.currentThread().getName() + "】y = " + y, "www.yootk.com");
                    System.out.println(map);
                }
            }, "集合操作线程-"+x).start();
        }
    }

    /**
     * 在ConcurrentHashMap之中是基于了哈希桶的形式来完成了数据的存储分类（依据HashCode来决定保存在那一个哈希桶之中）
     * 这个桶直接决定了数据同步的环境，只有该桶中的数据可以进行更新的独占锁配置，而其他的桶不受到任何影响。
     * 但是在早先的ConcurrentHashMap之中它是依靠Segament分段的结构来实现的资源同步处理的。
     */
    public static void test2() {
        Map<String, String> map = new ConcurrentHashMap<>();
        for (int x = 0; x < 10; x++) {
            new Thread(() -> {
                for (int y = 0; y < 10; y++) {
                    map.put("【" + Thread.currentThread().getName() + "】y = " + y, "www.yootk.com");
                    System.out.println(map);
                }
            }, "集合操作线程-"+x).start();
        }
    }
}
